﻿using System;
//DateTime和DateTimeOffset表示日期或者时间的不可变结构。它们的最小单位为100纳秒，值的范围从0001年到9999年。
//DateTimeOffset是从Framework 3.5开始引入的，在功能上类似于DateTime。它的主要特性是能够存储UTC偏移值，这允许我们在比较不同时区的时间值得到更有意义的结果。

//DateTime和DateTimeOffset的选择
//DateTime和DateTimeOffset在处理时区的方式上是不同的。DateTime具有三个状态标记，可表示DateTime是否与下列因素相关：
//    当前计算机的本地时间
//    UTC（相当于现代的格林威治时间）
//    不确定

//DateTimeOffset更加特殊——它将UTC的偏移量存储为一个TimeSpan：
//    July 01 2007 03:00:00 -06:00
//这会影响等值比较结果，而且是在DateTime和DateTimeOffset之间进行选择的主要依据。特别是：
//    DateTime会忽略三个比较状态标记，并且当两个值的年、月、日、时、分等相同时就认为它们是相等的。
//    如果两个值引用相同的时间点，那么DateTimeOffset就认为它们是相等的。
//提示：夏时制会使这个结果差别很大，即使应用程序不需要处理多个地理时区。
//所以：DateTime会认为下面两个值是不相同的，而DateTimeOffset则认为是相同的：
//    July 01 2007 09:00:00 +00:00 (GMT)
//    July 01 2007 03:00:00 -06:00 (local time, Central America)

//2.创建一个DateTime
//DateTime定义了能够接受年、月和日以及可选的时、分、秒和毫秒的构造方法。
/*
public DateTime(int year, int month, int day);
public DateTime(int year, int month, int day, int hour, int minute, int seond, int millisecond);
*/
//如果只指定日期，那么时间会被隐含地设置为半夜时间（0：00）

//3.创建一个DateTimeOffset
//DateTimeOffset具有类似的构造方法。其区别是还需要指定一个TimeSpan类型的UTC偏移值：
/*
public DateTimeOffset (int year, int month, int day, int hour, int minute, int second, TimeSpan offset);
public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, TimeSpan offset);
*/
//TimeSpan必须刚好是整数分钟，否则函数会抛出一个异常。

/*
 
public DateTimeOffset(DateTime dateTime);
public DateTimeOffset(DateTime dateTime, TimeSpan offset);
 
 */
namespace _158_日期和时间_DateTime和DateTimeOffset
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime d = new DateTime(5767, 1, 1, new System.Globalization.HebrewCalendar());
            Console.WriteLine(d); // 12/12/2006 12:00:00 AM

            //从DateTime隐式转换到DateTimeOffset是很简单的
            //DateTimeOffset dt = new DateTime(2000, 2, 3);

            //4.当前的DateTime/DateTimeOffset
            //DateTime和DateTimeOffset都具有一个静态的Now属性，它会返回当前的日期和时间：
            Console.WriteLine(DateTime.Now);
            Console.WriteLine(DateTimeOffset.Now);

            //DateTime也具有Today属性，它返回日期部分：
            Console.WriteLine(DateTime.Today);

            //静态的Utcnow属性会返回以UTC表示的当前日期和时间：
            Console.WriteLine(DateTime.UtcNow);
            Console.WriteLine(DateTimeOffset.UtcNow);

            //5.处理日期和时间
            //DateTime和DateTimeOffset提供返回各种日期/时间的类似实例属性：
            DateTime dt = new DateTime(2000, 2, 3, 10, 20, 30);
            Console.WriteLine(dt.Year); //2000
            Console.WriteLine(dt.Month); //2
            Console.WriteLine(dt.Day); //3
            Console.WriteLine(dt.DayOfWeek); //Thursday
            Console.WriteLine(dt.DayOfYear); //34

            Console.WriteLine(dt.Hour); //10
            Console.WriteLine(dt.Minute); //20
            Console.WriteLine(dt.Second); //30
            Console.WriteLine(dt.Millisecond);//0
            Console.WriteLine(dt.Ticks); //630851700300000000
            Console.WriteLine(dt.TimeOfDay); //10:20:30 返回一个TimeSpan值
            //DateTimeOffset也有一个类型为TimeSpan的Offset属性

            TimeSpan ts = TimeSpan.FromMinutes(90);
            Console.WriteLine(dt.Add(ts));
            Console.WriteLine(dt+ts);

            DateTime thisYear = new DateTime(2007, 1, 1);
            DateTime nextYear = thisYear.AddYears(1);
            TimeSpan oneYear = nextYear - thisYear;

            //6.格式化和解析
            //警告：如果文化设置与格式化发生时差别很大，那么DateTimes和DateTimeOffset可能会解析出错。可以通过使用ToString及一个忽略文化设置的格式化字符串来避免这个问题（例如：“o”）
            DateTime dt1 = DateTime.Now;
            string cannotBeMisparsed = dt1.ToString("o");
            DateTime dt2 = DateTime.Parse(cannotBeMisparsed);

            //7.DateTime和DateTimeOffset空值：
            //因为DateTime和DateTimeOffset是结构体，它们是不可为空的。
            //当需要将它们设置为空时，可以使用以下两种方法：
            //    使用一个Nullable类型值（例如：DateTime?或DateTimeOffset?）
            //    使用静态域DateTime.MinValue或DateTimeOffset.MinValue（这些默认值）
            Console.ReadKey();
        }
    }
}
